"""
Python高级特性学习 - 推导式
====================

本文件演示了Python中的列表推导式、字典推导式和集合推导式的使用方法，
以及它们相对于传统循环的优势和最佳实践。
"""

import time


def basic_list_comprehension():
    """基本列表推导式示例
    
    列表推导式是一种简洁地创建列表的方法，它比传统的for循环更高效且更易读。
    语法格式：[expression for item in iterable if condition]
    """
    print("=== 基本列表推导式 ===")
    
    # 传统方法创建平方数列表
    squares_old = []
    for x in range(10):
        squares_old.append(x**2)
    print(f"传统方法: {squares_old}")
    
    # 使用列表推导式创建平方数列表
    squares_new = [x**2 for x in range(10)]
    print(f"推导式方法: {squares_new}")
    
    # 带条件的列表推导式
    even_squares = [x**2 for x in range(10) if x % 2 == 0]
    print(f"偶数平方: {even_squares}")
    
    # 复杂表达式的推导式
    result = [x*y for x in range(1, 4) for y in range(1, 4)]
    print(f"乘积组合: {result}")


def basic_dict_comprehension():
    """基本字典推导式示例
    
    字典推导式用于创建字典，语法格式：{key_expression: value_expression for item in iterable if condition}
    """
    print("\n=== 基本字典推导式 ===")
    
    # 传统方法创建字典
    squares_dict_old = {}
    for x in range(5):
        squares_dict_old[x] = x**2
    print(f"传统方法: {squares_dict_old}")
    
    # 使用字典推导式
    squares_dict_new = {x: x**2 for x in range(5)}
    print(f"推导式方法: {squares_dict_new}")
    
    # 带条件的字典推导式
    even_squares_dict = {x: x**2 for x in range(10) if x % 2 == 0}
    print(f"偶数平方字典: {even_squares_dict}")
    
    # 从其他字典创建新字典
    original = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
    filtered = {k: v for k, v in original.items() if v > 2}
    print(f"过滤字典: {filtered}")
    
    # 键值互换
    swapped = {v: k for k, v in original.items()}
    print(f"键值互换: {swapped}")


def basic_set_comprehension():
    """基本集合推导式示例
    
    集合推导式用于创建集合，语法格式：{expression for item in iterable if condition}
    集合会自动去除重复元素。
    """
    print("\n=== 基本集合推导式 ===")
    
    # 传统方法创建集合
    unique_squares_old = set()
    for x in range(-5, 6):
        unique_squares_old.add(x**2)
    print(f"传统方法: {unique_squares_old}")
    
    # 使用集合推导式
    unique_squares_new = {x**2 for x in range(-5, 6)}
    print(f"推导式方法: {unique_squares_new}")
    
    # 从字符串创建字符集合
    text = "hello world"
    unique_chars = {char for char in text if char != ' '}
    print(f"唯一字符: {unique_chars}")


def performance_comparison():
    """性能比较示例
    
    比较列表推导式和传统for循环的性能差异。
    通常情况下，列表推导式比传统循环更快，因为它们在C语言层面进行了优化。
    """
    print("\n=== 性能比较 ===")
    n = 100000
    
    # 传统for循环
    start_time = time.time()
    result_loop = []
    for i in range(n):
        if i % 2 == 0:
            result_loop.append(i**2)
    loop_time = time.time() - start_time
    
    # 列表推导式
    start_time = time.time()
    result_comp = [i**2 for i in range(n) if i % 2 == 0]
    comp_time = time.time() - start_time
    
    print(f"传统循环耗时: {loop_time:.4f}秒")
    print(f"列表推导式耗时: {comp_time:.4f}秒")
    print(f"推导式快了: {loop_time/comp_time:.2f}倍")
    print(f"结果相同: {result_loop == result_comp}")


def nested_comprehensions():
    """嵌套推导式示例
    
    展示如何使用嵌套推导式处理二维数据结构。
    嵌套推导式的执行顺序是从左到右，相当于嵌套的for循环。
    """
    print("\n=== 嵌套推导式 ===")
    
    # 创建二维矩阵
    matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    print(f"原始矩阵: {matrix}")
    
    # 展平矩阵
    flattened = [num for row in matrix for num in row]
    print(f"展平矩阵: {flattened}")
    
    # 转置矩阵
    transposed = [[row[i] for row in matrix] for i in range(len(matrix[0]))]
    print(f"转置矩阵: {transposed}")
    
    # 筛选和变换
    filtered_transposed = [[row[i] * 2 for row in matrix if row[i] % 2 == 0] 
                          for i in range(len(matrix[0]))]
    print(f"筛选转置: {filtered_transposed}")


def best_practices():
    """推导式最佳实践
    
    提供使用推导式的最佳实践建议，避免过度复杂的推导式。
    """
    print("\n=== 最佳实践 ===")
    
    # 1. 保持推导式简洁
    print("1. 保持推导式简洁")
    # 好的例子
    simple_squares = [x**2 for x in range(10)]
    print(f"   简单推导式: {simple_squares}")
    
    # 2. 复杂逻辑使用传统循环
    print("2. 复杂逻辑使用传统循环")
    # 复杂的推导式难以理解
    # complex_comp = [x**2 if x % 2 == 0 else x**3 for x in range(10) if x > 3 and x < 8]
    # 相同逻辑的传统循环更清晰
    complex_result = []
    for x in range(10):
        if x > 3 and x < 8:
            if x % 2 == 0:
                complex_result.append(x**2)
            else:
                complex_result.append(x**3)
    print(f"   复杂逻辑用循环: {complex_result}")
    
    # 3. 使用生成器表达式处理大数据
    print("3. 使用生成器表达式处理大数据")
    # 列表推导式会立即创建所有元素
    list_comp = [x**2 for x in range(5)]
    print(f"   列表推导式: {list_comp} (类型: {type(list_comp)})")
    
    # 生成器表达式按需生成元素，节省内存
    gen_exp = (x**2 for x in range(5))
    print(f"   生成器表达式: {gen_exp} (类型: {type(gen_exp)})")
    print(f"   生成器元素: {list(gen_exp)}")


def main():
    """主函数 - 运行所有示例
    
    按顺序执行所有推导式相关的示例函数，展示不同类型的推导式及其用法。
    """
    print("Python推导式学习示例\n" + "=" * 30)
    
    basic_list_comprehension()
    basic_dict_comprehension()
    basic_set_comprehension()
    performance_comparison()
    nested_comprehensions()
    best_practices()
    
    print("\n所有示例执行完成！")


if __name__ == "__main__":
    main()